// SCUF.js 0.1.0

// (c) 2012 Rodrigo Casara
// SCUF pode ser distribuído gratuitamente sob a licença MIT.

(function() {
  // Salva uma referência para o objeto global (`window` no navegador).
  var root = this;

  // Namespace de nível superior. Todas as classes e módulos públicas serão anexados a ele.
  var SCUF;
  SCUF = root.SCUF = {};

  // Versão atual da biblioteca.
  SCUF.VERSAO = "0.1.0";

  var vwCabecalhoGrid  = SCUF.vwCabecalhoGrid = Backbone.View.extend({
    tagName: "thead",
    render: function() {
      $(this.el).html("<tr class='row-titles'></tr><tr class='row-filters'></tr>");
      return this;
    }
  });
  var vwCorpoGrid  = SCUF.vwCorpoGrid = Backbone.View.extend({tagName: "tbody"});
  var vwRodapeGrid  = SCUF.vwRodapeGrid = Backbone.View.extend({
    tagName: "tfoot",
    render: function() {
      $(this.el).html(this.template);
      return this;
    }
  });

  var vwTituloColuna = SCUF.vwTituloColuna = Backbone.View.extend({
    tagName: "th",
    render: function() {
      $(this.el).addClass("col-" + this.model.get("id")).html(this.template({model: this.model}));
      return this;
    }
  });

  var vwFiltroColuna = SCUF.vwFiltroColuna = Backbone.View.extend({
    tagName: "td",
    render: function() {
      $(this.el).addClass("col-" + this.model.get("id")).html(this.template({model: this.model}));
      return this;
    }
  });

  var vwLinhaGrid = SCUF.vwLinhaGrid = Backbone.View.extend({
    tagName: "tr",
    events: {
      "click": "selecionarLinha",
    },
    initialize: function() {
      _.bindAll(this, "render", "unrender", "selecionarLinha");
      this.model.on("change", this.render);
      this.model.on("remove", this.unrender);
    },
    render: function() {
      $(this.el).attr("linha-selecionada", "false").html(this.itemTemplate({model: this.model}));
      return this;
    },
    unrender: function(modelo, opcoes) {
      $(this.el).remove();
    },
    selecionarLinha: function(e) {
      if ($(this.el).hasClass("row-highlighting")) {
        $(this.el).removeClass("row-highlighting").attr("linha-selecionada", "false");
      } else {
        $(this.el).closest("tbody").children("tr.row-highlighting").removeClass("row-highlighting").attr("linha-selecionada", "false");
        $(this.el).addClass("row-highlighting").attr("linha-selecionada", "true");
      }
    },
  });

  var vwGrid = SCUF.vwGrid = Backbone.View.extend({
    events: {
      "keypress input.inputFiltro": "filtrar",
    },
    colunas: [],
    acoes: [],
    initialize: function() {
      $.extend(this.events, SCUF.vwGrid.prototype.events); // mescla eventos com da classe com os eventos das classes filhas.
      _.bindAll(this, "render", "filtrar");

      // Renderiza título das colunas e os filtros {{{
      var cabecalho = new SCUF.vwCabecalhoGrid;
      cabecalho.render();
      this.colunas.map(function(coluna, indice) {
        var tituloColuna = new SCUF.vwTituloColuna({model: new Backbone.Model(coluna)});
        $("tr.row-titles", cabecalho.el).append(tituloColuna.render().el);
        //
        coluna.tabindex = indice + 1;
        var filtroColuna = new SCUF.vwFiltroColuna({model: new Backbone.Model(coluna)});
        $("tr.row-filters", cabecalho.el).append(filtroColuna.render().el);
      });
      //}}}

      var corpo = new SCUF.vwCorpoGrid;

      // Renderiza ações {{{
      var rodape = new SCUF.vwRodapeGrid;
      rodape.render();
      this.acoes.map(function(acao) {
        $("tr > th.row-actions", rodape.el).append(
          _.template('<button id="<%= model.get("id") %>" class="<%= model.get("classe") %>"><%= model.get("icone") ? "<i class=\'" + model.get("icone") + "\'></i> " : "" %><%= model.get("titulo") %></button>', {model: new Backbone.Model(acao)})
        );
      });
      //}}}

      $(this.el).append(cabecalho.el, corpo.render().el, rodape.el);

      var self = this;
      this.colecoes = new Backbone.Collection;
      this.colecoes.model = Backbone.Model;
      this.colecoes.url = this.url;
      this.colecoes.on("add", function(modelo) {
        this.fetch({
          success: function() {
            self.render();
          }
        });
      });
      this.colecoes.add();
    },
    render: function() {
      var self = this;
      $("tbody", this.el).html("");
      var dados = this.colecoes.map(function(modelo) {
        var linha = new SCUF.vwLinhaGrid({model: modelo});
        $("tbody", self.el).append(linha.render().el);
      });
      return this;
    },
    linhaSelecionada: function() {
      var selecao = $("tbody tr.row-highlighting", this.el);
      if (selecao.length > 0) {
        selecao = _.first(selecao);
      } else {
        selecao = undefined;
      }
      return selecao;
    },
    // {{{
    filtrar: function(e) {
      if (e.which == 13) {
        var self = this;
        this.colecoes.fetch({
          data: $(e.target.form).serialize(),
          success: function() {
            self.render();
          }
        });
      }
    },
    //}}}
  });
}).call(this);